/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.persistencia.controller;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import mrp.persistencia.entity.Agregado;
import mrp.persistencia.entity.Tacosuela;
import mrp.persistencia.entity.Unidadmedida;
import mrp.persistencia.entity.Insumo;
import mrp.persistencia.entity.Forro;
import mrp.persistencia.entity.Cuero;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.UserTransaction;
import mrp.beans.util.EntityManagerUtil;
import mrp.persistencia.controller.exceptions.IllegalOrphanException;
import mrp.persistencia.controller.exceptions.NonexistentEntityException;
import mrp.persistencia.controller.exceptions.PreexistingEntityException;
import mrp.persistencia.controller.exceptions.RollbackFailureException;
import mrp.persistencia.entity.*;

/**
 *
 * @author root
 */
public class MateriaprimaJpaController implements Serializable {

    public MateriaprimaJpaController() {
        
        this.emf = EntityManagerUtil.getEntityManagerFactory();
    }

    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Materiaprima materiaprima) throws PreexistingEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
//            Agregado agregado = materiaprima.getAgregado();
//            if (agregado != null) {
//                agregado = em.getReference(agregado.getClass(), agregado.getCodmateriaprima());
//                materiaprima.setAgregado(agregado);
//            }
//            Tacosuela tacosuela = materiaprima.getTacosuela();
//            if (tacosuela != null) {
//                tacosuela = em.getReference(tacosuela.getClass(), tacosuela.getCodmateriaprima());
//                materiaprima.setTacosuela(tacosuela);
//            }
            Unidadmedida unidadmedidaFk = materiaprima.getUnidadmedidaFk();
            if (unidadmedidaFk != null) {
                unidadmedidaFk = em.getReference(unidadmedidaFk.getClass(), unidadmedidaFk.getCodunidadmedida());
                materiaprima.setUnidadmedidaFk(unidadmedidaFk);
            }
            Insumo insumoFk = materiaprima.getInsumoFk();
            if (insumoFk != null) {
                insumoFk = em.getReference(insumoFk.getClass(), insumoFk.getCodinsumo());
                materiaprima.setInsumoFk(insumoFk);
            }
//            Forro forro = materiaprima.getForro();
//            if (forro != null) {
//                forro = em.getReference(forro.getClass(), forro.getCodmateriaprima());
//                materiaprima.setForro(forro);
//            }
//            Cuero cuero = materiaprima.getCuero();
//            if (cuero != null) {
//                cuero = em.getReference(cuero.getClass(), cuero.getCodmateriaprima());
//                materiaprima.setCuero(cuero);
//            }
            em.persist(materiaprima);
//            if (agregado != null) {
//                Materiaprima oldMateriaprimaOfAgregado = agregado.getMateriaprima();
//                if (oldMateriaprimaOfAgregado != null) {
//                    oldMateriaprimaOfAgregado.setAgregado(null);
//                    oldMateriaprimaOfAgregado = em.merge(oldMateriaprimaOfAgregado);
//                }
//                agregado.setMateriaprima(materiaprima);
//                agregado = em.merge(agregado);
//            }
//            if (tacosuela != null) {
//                Materiaprima oldMateriaprimaOfTacosuela = tacosuela.getMateriaprima();
//                if (oldMateriaprimaOfTacosuela != null) {
//                    oldMateriaprimaOfTacosuela.setTacosuela(null);
//                    oldMateriaprimaOfTacosuela = em.merge(oldMateriaprimaOfTacosuela);
//                }
//                tacosuela.setMateriaprima(materiaprima);
//                tacosuela = em.merge(tacosuela);
//            }
//            if (unidadmedidaFk != null) {
//                unidadmedidaFk.getMateriaprimaList().add(materiaprima);
//                unidadmedidaFk = em.merge(unidadmedidaFk);
//            }
//            if (insumoFk != null) {
//                insumoFk.getMateriaprimaList().add(materiaprima);
//                insumoFk = em.merge(insumoFk);
//            }
//            if (forro != null) {
//                Materiaprima oldMateriaprimaOfForro = forro.getMateriaprima();
//                if (oldMateriaprimaOfForro != null) {
//                    oldMateriaprimaOfForro.setForro(null);
//                    oldMateriaprimaOfForro = em.merge(oldMateriaprimaOfForro);
//                }
//                forro.setMateriaprima(materiaprima);
//                forro = em.merge(forro);
//            }
//            if (cuero != null) {
//                Materiaprima oldMateriaprimaOfCuero = cuero.getMateriaprima();
//                if (oldMateriaprimaOfCuero != null) {
//                    oldMateriaprimaOfCuero.setCuero(null);
//                    oldMateriaprimaOfCuero = em.merge(oldMateriaprimaOfCuero);
//                }
//                cuero.setMateriaprima(materiaprima);
//                cuero = em.merge(cuero);
//            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            if (findMateriaprima(materiaprima.getCodmateriaprima()) != null) {
                throw new PreexistingEntityException("Materiaprima " + materiaprima + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Materiaprima materiaprima) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
            Materiaprima persistentMateriaprima = em.find(Materiaprima.class, materiaprima.getCodmateriaprima());
//            Agregado agregadoOld = persistentMateriaprima.getAgregado();
//            Agregado agregadoNew = materiaprima.getAgregado();
//            Tacosuela tacosuelaOld = persistentMateriaprima.getTacosuela();
//            Tacosuela tacosuelaNew = materiaprima.getTacosuela();
            Unidadmedida unidadmedidaFkOld = persistentMateriaprima.getUnidadmedidaFk();
            Unidadmedida unidadmedidaFkNew = materiaprima.getUnidadmedidaFk();
            Insumo insumoFkOld = persistentMateriaprima.getInsumoFk();
            Insumo insumoFkNew = materiaprima.getInsumoFk();
//            Forro forroOld = persistentMateriaprima.getForro();
//            Forro forroNew = materiaprima.getForro();
//            Cuero cueroOld = persistentMateriaprima.getCuero();
//            Cuero cueroNew = materiaprima.getCuero();
            List<String> illegalOrphanMessages = null;
//            if (agregadoOld != null && !agregadoOld.equals(agregadoNew)) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("You must retain Agregado " + agregadoOld + " since its materiaprima field is not nullable.");
//            }
//            if (tacosuelaOld != null && !tacosuelaOld.equals(tacosuelaNew)) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("You must retain Tacosuela " + tacosuelaOld + " since its materiaprima field is not nullable.");
//            }
//            if (forroOld != null && !forroOld.equals(forroNew)) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("You must retain Forro " + forroOld + " since its materiaprima field is not nullable.");
//            }
//            if (cueroOld != null && !cueroOld.equals(cueroNew)) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("You must retain Cuero " + cueroOld + " since its materiaprima field is not nullable.");
//            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
//            if (agregadoNew != null) {
//                agregadoNew = em.getReference(agregadoNew.getClass(), agregadoNew.getCodmateriaprima());
//                materiaprima.setAgregado(agregadoNew);
//            }
//            if (tacosuelaNew != null) {
//                tacosuelaNew = em.getReference(tacosuelaNew.getClass(), tacosuelaNew.getCodmateriaprima());
//                materiaprima.setTacosuela(tacosuelaNew);
//            }
            if (unidadmedidaFkNew != null) {
                unidadmedidaFkNew = em.getReference(unidadmedidaFkNew.getClass(), unidadmedidaFkNew.getCodunidadmedida());
                materiaprima.setUnidadmedidaFk(unidadmedidaFkNew);
            }
            if (insumoFkNew != null) {
                insumoFkNew = em.getReference(insumoFkNew.getClass(), insumoFkNew.getCodinsumo());
                materiaprima.setInsumoFk(insumoFkNew);
            }
//            if (forroNew != null) {
//                forroNew = em.getReference(forroNew.getClass(), forroNew.getCodmateriaprima());
//                materiaprima.setForro(forroNew);
//            }
//            if (cueroNew != null) {
//                cueroNew = em.getReference(cueroNew.getClass(), cueroNew.getCodmateriaprima());
//                materiaprima.setCuero(cueroNew);
//            }
            materiaprima = em.merge(materiaprima);
//            if (agregadoNew != null && !agregadoNew.equals(agregadoOld)) {
//                Materiaprima oldMateriaprimaOfAgregado = agregadoNew.getMateriaprima();
//                if (oldMateriaprimaOfAgregado != null) {
//                    oldMateriaprimaOfAgregado.setAgregado(null);
//                    oldMateriaprimaOfAgregado = em.merge(oldMateriaprimaOfAgregado);
//                }
//                agregadoNew.setMateriaprima(materiaprima);
//                agregadoNew = em.merge(agregadoNew);
//            }
//            if (tacosuelaNew != null && !tacosuelaNew.equals(tacosuelaOld)) {
//                Materiaprima oldMateriaprimaOfTacosuela = tacosuelaNew.getMateriaprima();
//                if (oldMateriaprimaOfTacosuela != null) {
//                    oldMateriaprimaOfTacosuela.setTacosuela(null);
//                    oldMateriaprimaOfTacosuela = em.merge(oldMateriaprimaOfTacosuela);
//                }
//                tacosuelaNew.setMateriaprima(materiaprima);
//                tacosuelaNew = em.merge(tacosuelaNew);
//            }
//            if (unidadmedidaFkOld != null && !unidadmedidaFkOld.equals(unidadmedidaFkNew)) {
//                unidadmedidaFkOld.getMateriaprimaList().remove(materiaprima);
//                unidadmedidaFkOld = em.merge(unidadmedidaFkOld);
//            }
//            if (unidadmedidaFkNew != null && !unidadmedidaFkNew.equals(unidadmedidaFkOld)) {
//                unidadmedidaFkNew.getMateriaprimaList().add(materiaprima);
//                unidadmedidaFkNew = em.merge(unidadmedidaFkNew);
//            }
//            if (insumoFkOld != null && !insumoFkOld.equals(insumoFkNew)) {
//                insumoFkOld.getMateriaprimaList().remove(materiaprima);
//                insumoFkOld = em.merge(insumoFkOld);
//            }
//            if (insumoFkNew != null && !insumoFkNew.equals(insumoFkOld)) {
//                insumoFkNew.getMateriaprimaList().add(materiaprima);
//                insumoFkNew = em.merge(insumoFkNew);
//            }
//            if (forroNew != null && !forroNew.equals(forroOld)) {
//                Materiaprima oldMateriaprimaOfForro = forroNew.getMateriaprima();
//                if (oldMateriaprimaOfForro != null) {
//                    oldMateriaprimaOfForro.setForro(null);
//                    oldMateriaprimaOfForro = em.merge(oldMateriaprimaOfForro);
//                }
//                forroNew.setMateriaprima(materiaprima);
//                forroNew = em.merge(forroNew);
//            }
//            if (cueroNew != null && !cueroNew.equals(cueroOld)) {
//                Materiaprima oldMateriaprimaOfCuero = cueroNew.getMateriaprima();
//                if (oldMateriaprimaOfCuero != null) {
//                    oldMateriaprimaOfCuero.setCuero(null);
//                    oldMateriaprimaOfCuero = em.merge(oldMateriaprimaOfCuero);
//                }
//                cueroNew.setMateriaprima(materiaprima);
//                cueroNew = em.merge(cueroNew);
//            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = materiaprima.getCodmateriaprima();
                if (findMateriaprima(id) == null) {
                    throw new NonexistentEntityException("The materiaprima with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            
            em = getEntityManager();
            em.getTransaction().begin();
            Materiaprima materiaprima;
            try {
                materiaprima = em.getReference(Materiaprima.class, id);
                materiaprima.getCodmateriaprima();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The materiaprima with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
//            Agregado agregadoOrphanCheck = materiaprima.getAgregado();
//            if (agregadoOrphanCheck != null) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("This Materiaprima (" + materiaprima + ") cannot be destroyed since the Agregado " + agregadoOrphanCheck + " in its agregado field has a non-nullable materiaprima field.");
//            }
//            Tacosuela tacosuelaOrphanCheck = materiaprima.getTacosuela();
//            if (tacosuelaOrphanCheck != null) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("This Materiaprima (" + materiaprima + ") cannot be destroyed since the Tacosuela " + tacosuelaOrphanCheck + " in its tacosuela field has a non-nullable materiaprima field.");
//            }
//            Forro forroOrphanCheck = materiaprima.getForro();
//            if (forroOrphanCheck != null) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("This Materiaprima (" + materiaprima + ") cannot be destroyed since the Forro " + forroOrphanCheck + " in its forro field has a non-nullable materiaprima field.");
//            }
//            Cuero cueroOrphanCheck = materiaprima.getCuero();
//            if (cueroOrphanCheck != null) {
//                if (illegalOrphanMessages == null) {
//                    illegalOrphanMessages = new ArrayList<String>();
//                }
//                illegalOrphanMessages.add("This Materiaprima (" + materiaprima + ") cannot be destroyed since the Cuero " + cueroOrphanCheck + " in its cuero field has a non-nullable materiaprima field.");
//            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
//            Unidadmedida unidadmedidaFk = materiaprima.getUnidadmedidaFk();
//            if (unidadmedidaFk != null) {
//                unidadmedidaFk.getMateriaprimaList().remove(materiaprima);
//                unidadmedidaFk = em.merge(unidadmedidaFk);
//            }
//            Insumo insumoFk = materiaprima.getInsumoFk();
//            if (insumoFk != null) {
//                insumoFk.getMateriaprimaList().remove(materiaprima);
//                insumoFk = em.merge(insumoFk);
//            }
            em.remove(materiaprima);
            em.getTransaction().commit();
        } catch (Exception ex) {
            try {
                em.getTransaction().rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Materiaprima> findMateriaprimaEntities() {
        return findMateriaprimaEntities(true, -1, -1);
    }

    public List<Materiaprima> findMateriaprimaEntities(int maxResults, int firstResult) {
        return findMateriaprimaEntities(false, maxResults, firstResult);
    }

    private List<Materiaprima> findMateriaprimaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Materiaprima.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Materiaprima findMateriaprima(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Materiaprima.class, id);
        } finally {
            em.close();
        }
    }

    public int getMateriaprimaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Materiaprima> rt = cq.from(Materiaprima.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    public List<Materiaprima> findMateriaprimaWhereOrderBy(String consulta,boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
//            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
//            cq.select(cq.from(Cliente.class));
//            Query q = em.createQuery(cq);
//            Query q = em.createQuery("SELECT o FROM Cliente o where "+ +" order by o.numerocliente");
            Query q = em.createQuery(consulta);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }
}
